#include <bits/stdc++.h>
using namespace std;

const int mx = 1e6 + 10; // 定义最大数值范围
int cnt[mx];             // 计数数组，记录每个数值出现的次数

void solve() {
  int n, d; // n: 数字数量, d: 模数
  cin >> n >> d;

  // 读取输入并统计每个数字出现的次数
  for (int i = 0; i < n; i++) {
    int val;
    cin >> val;
    cnt[val]++;
  }

  // 处理d=0的特殊情况(所有相同数字只能保留一个)
  if (d == 0) {
    int dup = 0; // 统计不同数字的数量
    for (int i = 0; i < mx; i++)
      dup += (cnt[i] > 0);
    cout << n - dup << '\n'; // 输出需要删除的数量(总数-不同数字数)
    return;
  }

  int ans = 0;
  // 对每个余数分组处理(0到d-1)
  for (int i = 0; i < d; i++) {
    int last_take = 0,
        last_skip = 0; // last_take: 取当前数字, last_skip: 不取当前数字

    // 处理当前余数分组(i, i+d, i+2d...)
    for (int j = i; j < mx; j += d) {
      // 动态规划状态转移:
      // 不能连续取两个相邻的数字(在模d意义下相邻)
      // tie(last_take, last_skip) =
      //     make_pair(last_skip, min(last_take, last_skip) + cnt[j]);
      int curr_take = last_skip;
      int curr_skip = min(last_take, last_skip) + cnt[j];
      last_take = curr_take;
      last_skip = curr_skip;
    }
    ans += min(last_take, last_skip); // 取当前余数分组的最优解
  }
  cout << ans << '\n'; // 输出需要删除的最小数量
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0); // 加速输入输出
  solve();
  return 0;
}
